# -*- coding: utf-8 -*-
"""
航班数据解析模块。
将 jsonp 格式的航班信息解析为 markdown 格式。
"""
import json
import re
from datetime import datetime
from typing import List, Dict, Any
from utils.uuid_utils import generate_timestamp_id

class FlightFliggyDataParse:

    def parse(self, jsonp_str: str = "jsonp1729({})"):
        """
        飞猪航班数据解析
        将 JSONP 字符串转换为 Markdown 表格

        参数:
            jsonp_str (str): 包含航班数据的JSONP字符串，默认值为"jsonp1729({})"

        返回:
            str: 生成的Markdown表格字符串
        """

        try:
            json_data = self.__jsonp_to_json(jsonp_str) # 转换JSONP为JSON对象
        except Exception as e:
            return False, ""

        if json_data.get('status', 0) != 200 or json_data.get('success', 0) != 1:
            return False, ""

        all_flights = self.__extract_all_flights(json_data) # 提取所有航班信息
        markdown_table = self.__flights_to_markdown_table(all_flights) # 生成Markdown表格
        
        return True, markdown_table

    def __jsonp_to_json(self, jsonp_str):
        """
        将 JSONP 字符串转换为 JSON 对象

        参数:
        jsonp_str (str): 包含 JSONP 数据的字符串

        返回:
        dict: 解析后的 JSON 对象
        """
        # 移除JSONP函数包装
        json_str = re.sub(r'^[a-zA-Z0-9_]+\(|\);?$', '', jsonp_str)

        # 非标准 JSON 字符串修正
        fixed_json_str = re.sub(r'(?<=[{,])\s*([a-zA-Z_0-9]\w*)\s*:', r'"\1":', json_str) # 使用正则表达式，修复 JSON key 没有双引号包裹问题

        return json.loads(fixed_json_str)


    def __timestamp_to_datetime(self, timestamp):
        """将时间戳转换为可读日期时间格式"""
        return datetime.fromtimestamp(timestamp / 1000).strftime('%Y-%m-%d %H:%M')


    def __format_duration(self, minutes):
        """将分钟数转换为小时数格式"""
        mins = minutes % 60
        if mins == 0:
            return f"{minutes/60:.0f} 小时"
        else:
            return f"{minutes/60:.1f} 小时"


    def __format_price(self, price):
        """格式化价格（分转换为元）"""
        return f"¥{price/100:.0f}"


    def __extract_all_flights(self, flight_data):
        """
        从JSON数据中提取所有航班信息

        参数:
        flight_data (dict): 包含航班数据的 JSON 对象

        返回:
        list: 提取出的所有航班信息列表，每个航班信息为一个字典
        """
        flights = []
        
        # 检查是否有航班数据
        if 'data' not in flight_data or 'flightItems' not in flight_data['data']:
            return flights
        
        # 遍历所有航班项
        for flight_item in flight_data['data']['flightItems']:
            # 检查是否有航班信息
            if 'flightInfo' not in flight_item:
                continue

            # 遍历航班信息
            for flight_info in flight_item['flightInfo']:
                dep_city = "" # 出发城市
                arr_City = "" # 到达城市
                airline_list = [] # 航空公司
                flight_no_list = [] # 航班号
                aircraft = "" # 机型
                flight_segments = 0 # 航段数量

                # 提取航段信息
                for segment in flight_info.get('flightSegments', []):
                    if len(dep_city) == 0: dep_city = segment.get('depCityName', '') # 出发城市
                    arr_City = segment.get('arrCityName', '') # 到达城市
                    airline_list.append(segment.get('marketingAirlineName', '')) # 航空公司
                    flight_no_list.append(segment.get('marketingFlightNo', '')) # 航班号
                    aircraft = aircraft + f"{segment.get('equipTypeName', '')} ({segment.get('equipTypeCode', '')})" + ", " # 机型
                    flight_segments = flight_segments + 1

                flight = {
                    'id': generate_timestamp_id(),
                    'airline': ", ".join(airline_list), # 航空公司
                    'flight_no': ", ".join(flight_no_list), # 航班号
                    'dep_city': dep_city, # 出发城市
                    'arr_city': arr_City, # 到达城市
                    'dep_airport': f"{flight_info.get('depAirportName', '')} {flight_info.get('depTerm', '')}", # 出发机场
                    'dep_time': self.__timestamp_to_datetime(flight_info.get('depTimeStamp', 0)), # 出发时间
                    'arr_airport': f"{flight_info.get('arrAirportName', '')} {flight_info.get('arrTerm', '')}", # 到达机场
                    'arr_time': self.__timestamp_to_datetime(flight_info.get('arrTimeStamp', 0)), # 到达时间
                    'duration': self.__format_duration(flight_info.get('duration', 0)), # 飞行时长
                    'aircraft': aircraft, # 机型
                    'transfer': flight_info.get('transfer', False), # 中转（是、否）
                    'flight_segments': f"{flight_segments}", # 航段数量
                    'transfer_city': ', '.join(flight_info.get('transferCities', [])), # 中转城市
                    'transfer_time': self.__format_duration(flight_info.get('transferType', 0)) if flight_info.get('transfer') else '', # 中转时间
                    'total_price': self.__format_price(flight_item.get('totalAdultPrice', 0)) # 价格（总价）
                }
                flights.append(flight)
        return flights


    def __flights_to_markdown_table(self, flights):
        """
        将航班列表转换为Markdown表格

        参数:
        flights (list): 包含航班信息的列表，每个航班信息为一个字典

        返回:
        str: 生成的Markdown表格字符串
        """
        if not flights:
            return f"没有找到航班信息。"
        
        # 表头
        headers = [
            "ID", "出发", "到达", "飞行时长", "价格", 
            "出发机场", "到达机场", "出发时间", "到达时间", 
            "航空公司", "航班号", "机型", "中转", "航段数量", 
            "中转城市", "中转时间"
        ]
        
        # 构建Markdown表格
        md_table = []
        
        # 添加表头
        md_table.append("| " + " | ".join(headers) + " |")
        
        # 添加分隔线
        md_table.append("|" + "|".join(["---"] * len(headers)) + "|")
        
        # 添加数据行
        for flight in flights:
            row = [
                flight['id'],
                flight['dep_city'],
                flight['arr_city'],
                flight['duration'],
                flight['total_price'],
                flight['dep_airport'],
                flight['arr_airport'],
                flight['dep_time'],
                flight['arr_time'],
                flight['airline'],
                flight['flight_no'],
                flight['aircraft'],
                "是" if flight['transfer'] else "否",
                flight['flight_segments'],
                flight['transfer_city'],
                flight['transfer_time']
            ]
            md_table.append("| " + " | ".join(row) + " |")
        
        return "\n".join(md_table)
